#include "stm32f10x.h"
#include "delay.h"
#include "key.h"
uint8_t Send_F=0;
void KEY4X4_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);//开启GPIE时钟
    //行    
GPIO_InitStruct.GPIO_Pin=KEY_GPIO_PIN0|KEY_GPIO_PIN1|KEY_GPIO_PIN2|KEY_GPIO_PIN3;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOX,&GPIO_InitStruct);
    //列
GPIO_InitStruct.GPIO_Pin=KEY_GPIO_PIN4|KEY_GPIO_PIN5|KEY_GPIO_PIN6|KEY_GPIO_PIN7;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOX,&GPIO_InitStruct);
}
uint16_t KEY4X4_scan(uint16_t key_val)
{
    uint16_t temp=0;
				/*第一行*/
    GPIOX->ODR=0X00;
    GPIOX->ODR=0XFE;
    if((GPIOX->IDR&0XF0)!=0XF0)
    {
        delay_ms(50);
        if((GPIOX->IDR & 0XF0)!=0XF0)
        {
            temp=(GPIOX->IDR&0XFE);
            switch(temp)
            {
                case 0xEE:  key_val=1;  break;
                case 0xDE:  key_val=2;  break;
                case 0xBE:  key_val=3;  break;
                case 0x7E:  key_val=4;  break;
                default:    key_val=0;   break;
            }
        }
    }
		/*第二行*/
    GPIOX->ODR=0X00;
    GPIOX->ODR=0XFD;
    if((GPIOX->IDR&0XF0)!=0XF0)
    {
        delay_ms(50);
        if((GPIOX->IDR & 0XF0)!=0XF0)
        {
            temp=(GPIOX->IDR&0XFD);
            switch(temp)
            {
                case 0xED:  key_val=5;   break;
                case 0xDD:  key_val=6;  break;
                case 0xBD:  key_val=7;  break;
                case 0x7D:  key_val=8;  break;
                default:    key_val=0;   break;
            }
        }
    }
		/*第三行*/
    GPIOX->ODR=0X00;
    GPIOX->ODR=0XFB;
    if((GPIOX->IDR&0XF0)!=0XF0)
    {
        delay_ms(50);
        if((GPIOX->IDR & 0XF0)!=0XF0)
        {
            temp=(GPIOX->IDR&0XFB);
            switch(temp)
            {
                case 0xEB:  key_val=9;  break;
                case 0xDB:  key_val=10;  break;
                case 0xBB:  key_val=11;  break;
                case 0x7B:  key_val=12;  break;
                default:    key_val=0;  break;
            }
        }
    }
		/*第四行*/
    GPIOX->ODR=0X00;
    GPIOX->ODR=0XF7;
    if((GPIOX->IDR&0XF0)!=0XF0)
    {
        delay_ms(50);
        if((GPIOX->IDR & 0XF0)!=0XF0)
        {
            temp=(GPIOX->IDR&0XF7);
            switch(temp)
            {
                case 0xE7:  key_val=13;   break;
              case 0xD7:  key_val=14;   break;
                case 0xB7:  key_val=15;   break;
                case 0x77:  key_val=16;   break;
                default:    key_val=0;   break;
            }
        }
    }
    return key_val;
}